package main

import (
	"log"
	"math/rand"
	"sync"
	"time"
)

func main() {
	rand.Seed(time.Now().UnixNano())
	log.SetFlags(log.Ldate | log.Lshortfile)
	// ...
	const Max = 1000000
	const NumReceivers = 100

	wg := sync.WaitGroup{}
	wg.Add(NumReceivers)
	
	// 	...
	dataCh := make(chan int)

	// 发送者
	go func() {
		for {
			if value := rand.Intn(Max); value == 0 {
				// 此处唯一的方式可以关闭通道的数据
				close(dataCh)
				return
			} else {
				dataCh <- value
			}
		}
	}()
	// 接受者
	for i := 0; i < NumReceivers; i++ {
		go func() {
			defer wg.Done()
			// 接受者数据直到通道 dataCh 关闭
			for value := range dataCh {
				log.Println(value)
			}
		}()
	}
	wg.Wait()
}